<?php

/**
* Smarty Internal Plugin Compile extend
*
* Compiles the {extends} tag
*
* @package Smarty
* @subpackage Compiler
* @author Uwe Tews
*/

/**
 * Smarty Internal Plugin Compile extend Class
 *
 * @package Smarty
 * @subpackage Compiler
 *            
 */
class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
	
	/**
	 * Attribute definition: Overwrites base class.
	 *
	 * @var array
	 * @see Smarty_Internal_CompileBase
	 */
	public $required_attributes = array ('file' );
	/**
	 * Attribute definition: Overwrites base class.
	 *
	 * @var array
	 * @see Smarty_Internal_CompileBase
	 */
	public $shorttag_order = array ('file' );
	
	/**
	 * Compiles code for the {extends} tag
	 *
	 * @param $args array
	 *       	 array with attributes from parser
	 * @param $compiler object
	 *       	 compiler object
	 * @return string compiled code
	 */
	public function compile($args, $compiler) {
		static $_is_stringy = array ('string' => true, 'eval' => true );
		$this->_rdl = preg_quote ( $compiler->smarty->right_delimiter );
		$this->_ldl = preg_quote ( $compiler->smarty->left_delimiter );
		$filepath = $compiler->template->source->filepath;
		// check and get attributes
		$_attr = $this->getAttributes ( $compiler, $args );
		if ($_attr ['nocache'] === true) {
			$compiler->trigger_template_error ( 'nocache option not allowed', $compiler->lex->taglineno );
		}
		
		$_smarty_tpl = $compiler->template;
		$include_file = null;
		if (strpos ( $_attr ['file'], '$_tmp' ) !== false) {
			$compiler->trigger_template_error ( 'illegal value for file attribute', $compiler->lex->taglineno );
		}
		eval ( '$include_file = ' . $_attr ['file'] . ';' );
		// create template object
		$_template = new $compiler->smarty->template_class ( $include_file, $compiler->smarty, $compiler->template );
		// save file dependency
		if (isset ( $_is_stringy [$_template->source->type] )) {
			$template_sha1 = sha1 ( $include_file );
		} else {
			$template_sha1 = sha1 ( $_template->source->filepath );
		}
		if (isset ( $compiler->template->properties ['file_dependency'] [$template_sha1] )) {
			$compiler->trigger_template_error ( "illegal recursive call of \"{$include_file}\"", $compiler->lex->line - 1 );
		}
		$compiler->template->properties ['file_dependency'] [$template_sha1] = array ($_template->source->filepath, $_template->source->timestamp, $_template->source->type );
		$_content = substr ( $compiler->template->source->content, $compiler->lex->counter - 1 );
		if (preg_match_all ( "!({$this->_ldl}block\s(.+?){$this->_rdl})!", $_content, $s ) != preg_match_all ( "!({$this->_ldl}/block{$this->_rdl})!", $_content, $c )) {
			$compiler->trigger_template_error ( 'unmatched {block} {/block} pairs' );
		}
		preg_match_all ( "!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE );
		$_result_count = count ( $_result [0] );
		$_start = 0;
		while ( $_start + 1 < $_result_count ) {
			$_end = 0;
			$_level = 1;
			if (substr ( $_result [0] [$_start] [0], 0, strlen ( $compiler->smarty->left_delimiter ) + 1 ) == $compiler->smarty->left_delimiter . '*') {
				$_start ++;
				continue;
			}
			while ( $_level != 0 ) {
				$_end ++;
				if (substr ( $_result [0] [$_start + $_end] [0], 0, strlen ( $compiler->smarty->left_delimiter ) + 1 ) == $compiler->smarty->left_delimiter . '*') {
					continue;
				}
				if (! strpos ( $_result [0] [$_start + $_end] [0], '/' )) {
					$_level ++;
				} else {
					$_level --;
				}
			}
			$_block_content = str_replace ( $compiler->smarty->left_delimiter . '$smarty.block.parent' . $compiler->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%', substr ( $_content, $_result [0] [$_start] [1] + strlen ( $_result [0] [$_start] [0] ), $_result [0] [$_start + $_end] [1] - $_result [0] [$_start] [1] - + strlen ( $_result [0] [$_start] [0] ) ) );
			Smarty_Internal_Compile_Block::saveBlockData ( $_block_content, $_result [0] [$_start] [0], $compiler->template, $filepath );
			$_start = $_start + $_end + 1;
		}
		if ($_template->source->type == 'extends') {
			$_template->block_data = $compiler->template->block_data;
		}
		$compiler->template->source->content = $_template->source->content;
		if ($_template->source->type == 'extends') {
			$compiler->template->block_data = $_template->block_data;
			foreach ( $_template->source->components as $key => $component ) {
				$compiler->template->properties ['file_dependency'] [$key] = array ($component->filepath, $component->timestamp, $component->type );
			}
		}
		$compiler->template->source->filepath = $_template->source->filepath;
		$compiler->abort_and_recompile = true;
		return '';
	}

}

?>